package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * @author DBX
 * @effect 排序自定义类型元素的集合
 * @date 2021/09/04/9:20
 */
public class SortListDemo1 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(1,2));
        list.add(new Point(3,23));
        list.add(new Point(12,22));
        list.add(new Point(13,21));
        list.add(new Point(14,25));
        list.add(new Point(15,28));
        System.out.println(list);
        /*
        * Collections.sort(List list) 该方法要求集合必须实现Comparable接口（可比较）
        * 然后其基于接口要求重写的比较方法来比较集合元素的大小而完成排序
        * 当我们在使用一个方法完成某个功能时，该方法要求我们为其修改其他地方的代码时，这个方法就对我们的代码
        * 具有了侵入性，这不利于程序后期的维护升级，应当尽量避免*/
//        Collections.sort(list);编译不通过

        Comparator<Point> c = new Comparator<Point>() {
            @Override
            /*compare用于定义参数o1和o2的比较规则*/
            public int compare(Point o1, Point o2) {
                int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
                int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
                return len1-len2;
            }
        };

        /*
        * 重载的sort方法要求我们传入一个比较器（为集合元素单独定义的一个比较规则），此方法不需要实现Comparable接口*/
        Collections.sort(list,c);
        System.out.println("第一次排序"+list);
//        Collections.shuffle(list);
        list.add(new Point(1,1));
        System.out.println(list);

        Collections.sort(list, new Comparator<Point>() {
            @Override
            public int compare(Point o1, Point o2) {
                return o1.getX()*o1.getX()+o1.getY()*o1.getY()-(o2.getX()*o2.getX()+o2.getY()*o2.getY());
            }
        });
        System.out.println("第二次排序"+list);
        Collections.sort(list,(o1,o2)->o1.getX()*o1.getX()+o1.getY()*o1.getY()- (o2.getX()*o2.getX()+o2.getY()*o2.getY()));
        System.out.println("第三次排序"+list);
    }
}
